package org.jabref.gui.documentviewer;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.util.Objects;
import javafx.embed.swing.SwingFXUtils;
import javafx.scene.image.Image;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
/**
* Represents the view model of a pdf page backed by a {@link PDPage}.
*/
public class PdfDocumentPageViewModel extends DocumentPageViewModel {
private final PDPage page;
private final int pageNumber;
public PdfDocumentPageViewModel(PDPage page, int pageNumber) {
this.page = Objects.requireNonNull(page);
this.pageNumber = pageNumber;
}
// Taken from http://stackoverflow.com/a/9417836/873661
private static BufferedImage resize(BufferedImage img, int newWidth, int newHeight) {
java.awt.Image tmp = img.getScaledInstance(newWidth, newHeight, java.awt.Image.SCALE_SMOOTH);
BufferedImage dimg = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = dimg.createGraphics();
g2d.drawImage(tmp, 0, 0, null);
g2d.dispose();
return dimg;
}
@Override
public Image render(int width, int height) {
try {
int resolution = 96;
BufferedImage image = page.convertToImage(BufferedImage.TYPE_INT_RGB, 2 * resolution);
return SwingFXUtils.toFXImage(resize(image, width, height), null);
} catch (IOException e) {
// TODO: LOG
return null;
}
}
@Override
public int getPageNumber() {
return pageNumber;
}
@Override
public double getAspectRatio() {
PDRectangle mediaBox = page.getMediaBox();
return mediaBox.getWidth() / mediaBox.getHeight();
}
}